#!/usr/bin/evn python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   文件名称 :     __init__.py
   文件功能描述 :   功能描述
   创建人 :       小钟同学
   创建时间 :          2021/12/6
-------------------------------------------------
   修改描述-2021/12/6:         
-------------------------------------------------
"""

import grpc
import json
from grpcframe.zyxgrpc.globals import gcontext
from grpc_interceptor.exceptions import GrpcException

class RpcException(GrpcException):
    '''
    自定义异常状态抛出！
    '''
    # 错误的状态码
    code = grpc.StatusCode.INVALID_ARGUMENT
    # 错误的描述信息，它仅仅支持str类似的，如果是其他类型的数据如list, dict需转化str
    details = None

    def __init__(self, message=None, *args, **kwargs):
        # 判断错误描述类型
        if isinstance(message, (list, dict)):
            message = json.dumps(
                message, default=str, ensure_ascii=True)

        if message is not None:
            # 如果不是str进行强制的转化
            if not isinstance(message, str):
                message = str(message)
            self.details = message

        if self.details and not message and isinstance(self.details, (list, dict)):
            self.details = json.dumps(self.details, default=str, ensure_ascii=True)

        super().__init__(message, *args, **kwargs)
        # 直接的抛出错误异常信息
        self._abort_with_status()

    def _abort_with_status(self):
        gcontext.abort(self.code, self.details)


class NotFoundException(RpcException):
    code = grpc.StatusCode.NOT_FOUND
    details = "NotFound"


class BadRequestException(RpcException):
    code = grpc.StatusCode.INVALID_ARGUMENT
    details = '不对劲！！！！'
